package com.whfc.safety.dao;

import com.whfc.common.exception.BizException;
import com.whfc.entity.dto.statistics.CheckDetailDTO;
import com.whfc.entity.param.check.CheckSearchParam;
import com.whfc.safety.dto.*;
import com.whfc.safety.entity.SafetyCheck;
import com.whfc.safety.param.SafetyCheckListParam;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author : qzexing
 * @version : 1.0
 * @date : 2020-08-04 11:05
 */

public interface SafetyCheckMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(SafetyCheck record);

    int insertSelective(SafetyCheck record);

    SafetyCheck selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(SafetyCheck record);

    int updateByPrimaryKey(SafetyCheck record);

    /**
     * 查询问题上报列表
     *
     * @param safetyCheckListParam 问题上报请求类
     * @return List<SafetyCheckDTO> 问题列表返回类
     * @author hw
     * @date 2020/8/5 11:17
     **/
    List<SafetyCheckDTO> selectByDeptId(SafetyCheckListParam safetyCheckListParam);

    /**
     * 查询对应数据
     *
     * @param safetyCheckListParam 问题上报请求类
     * @return
     * @author hw
     * @date 2020/8/5 11:17
     **/
    Integer countReport(SafetyCheckListParam safetyCheckListParam);

    /**
     * 使用主键查询问题表详情
     *
     * @param id 问题表主键id
     * @return SafetyCheckDescDTO
     * @author hw
     * @date 2020/8/5 11:17
     **/
    SafetyCheckDescDTO selectById(@Param("id") Integer id);


    /**
     * 使用问题提交时间查询问题数量
     *
     * @param deptId    组织机构ID
     * @param checkTime 问题提交时间
     * @param channel   1- 日，2-年
     * @return Integer
     * @author hw
     * @date 2020/8/5 11:17
     **/
    Integer selectByCheckTime(@Param("deptId") Integer deptId, @Param("userId") Integer userId, @Param("checkTime") Date checkTime, @Param("channel") Integer channel);

    /**
     * 使用提交时间和状态查询问题数量
     *
     * @param deptId    组织机构ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     * @author hw
     * @date 2020/8/3 18:54
     **/
    List<Map<String, Long>> selectByStateAndCheckTime(@Param("deptId") Integer deptId, @Param("userId") Integer userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 使用提交时间和紧急程度查询问题数量
     *
     * @param deptId    组织机构ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     * @author hw
     * @date 2020/8/3 19:05
     **/
    List<Map<String, Long>> selectByUrgencyAndCheckTime(@Param("deptId") Integer deptId, @Param("userId") Integer userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);


    /**
     * 查询传入时间区间问题上报类别数量
     *
     * @param deptId    组织机构ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return List<SafetyCheckIssueStatisticalDTO>
     * @author hw
     * @date 2020/8/3 18:51
     **/
    List<SafetyCheckIssueStatisticalDTO> selectIssueByCheckTime(@Param("deptId") Integer deptId, @Param("userId") Integer userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询传入时间区间问题上报部位数量
     *
     * @param deptId    组织机构ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     * @author hw
     * @date 3 19:26
     **/
    List<SafetyCheckPartStatisticalDTO> selectPartByCheckTime(@Param("deptId") Integer deptId, @Param("userId") Integer userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询全部上报信息
     *
     * @return
     * @author hw
     * @date 2020/8/12 9:21
     **/
    List<Integer> selectCheckIdAll();

    /**
     * 更新超期状态
     *
     * @param checkIds 问题id
     * @return
     * @throws BizException 业务异常
     * @author hw
     * @date 2020/8/12 11:28
     **/
    void updateOverdue(@Param("checkIds") List<Integer> checkIds);

    /**
     * 问题日志
     *
     * @param deptId
     * @param date
     * @return
     */
    List<SafetyUserNumDTO> selectUserNum(@Param("deptId") Integer deptId, @Param("date") Date date);

    /**
     * 问题日志
     *
     * @param deptId
     * @return
     */
    List<SafetyIssueNumDTO> selectIssueNum(@Param("deptId") Integer deptId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询危大字典上报统计
     *
     * @param dangerIds
     * @return
     */
    List<SafetyCheckObjNumDTO> selectDangerCheckNumByDangerIds(@Param("dangerIds") List<Integer> dangerIds);

    /**
     * 查询带有关联的问题上报
     *
     * @param dangerId
     * @return
     */
    List<SafetyCheckDTO> selectByObjId(Integer dangerId);

    /**
     * 查询带有关联的问题上报详情
     *
     * @param checkId
     * @return
     */
    SafetyCheckDescDTO selectObjById(Integer checkId);

    /**
     * 软删除
     *
     * @param checkId
     */
    void del(Integer checkId);

    /**
     * 统计隐患数量
     *
     * @param deptId
     * @param startTime
     * @param endTime
     * @return
     */
    Integer selectCurDangerCheckNumByDeptId(@Param("deptId") Integer deptId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 统计隐患数量
     *
     * @param dangerId
     * @return
     */
    Integer selectDangerCheckNumByDangerId(Integer dangerId);

    /**
     * 未销问题分析
     *
     * @param deptId
     * @param startTime
     * @param endTime
     * @return
     */
    SafetyCheckUnfinishedDTO selectUnfinishedByDeptId(@Param("deptId") Integer deptId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 问题统计
     *
     * @param deptId
     * @param startTime
     * @param endTime
     * @return
     */
    SafetyCheckScreenDTO selectStatisticalByDeptId(@Param("deptId") Integer deptId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 上报问题类别分析
     *
     * @param deptId
     * @param startTime
     * @param endTime
     * @return
     */
    List<SafetyIssueNumDTO> selectIssueTypeNum(@Param("deptId") Integer deptId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 上报问题类别分析
     *
     * @param deptId
     * @param startTime
     * @param endTime
     * @return
     */
    List<SafetyIssueNumDTO> selectIssueTypeIdNum(@Param("deptId") Integer deptId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取安全检查记录
     *
     * @param deptId 组织机构ID
     * @return 安全检查记录
     */
    List<MdSafetyCheckDTO> selectMdBoardCheckList(@Param("deptId")Integer deptId);

    /**
     * 获取新增问题数量
     *
     * @param deptId    组织架构ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 新增问题数量
     */
    Integer countCheckNewIssue(@Param("deptId") Integer deptId,
                               @Param("startTime") Date startTime,
                               @Param("endTime") Date endTime);

    /**
     * 统计待整改数量
     *
     * @param deptId 组织架构ID
     * @return 待整改数量
     */
    Integer countCheckToBeRectified(@Param("deptId") Integer deptId);

    /**
     * 统计检查数量
     *
     * @param deptId 组织架构ID
     * @param state  状态
     * @return 检查数量
     */
    Integer countCheckNum(@Param("deptId") Integer deptId,
                          @Param("state") Integer state);

    /**
     * 获取安全的组织机构ID列表
     *
     * @return 组织机构ID列表
     */
    List<Integer> selectSafetyDeptIds();


    /**
     * 统计当天完成
     *
     * @param deptId 组织机构ID
     * @param date   日期
     * @return 当天完成数量
     */
    Integer countCheckComplete(@Param("deptId") Integer deptId, @Param("date") Date date);

    List<SafetyCheckDescDTO> selectByIds(@Param("checkIds")List<Integer> ckeckIds);

    List<SafetyCheckCountDTO> selectByCheckTimeAndUrgency(@Param("deptId")Integer deptId, @Param("urgency")Integer urgency, @Param("startTime")Date startTime, @Param("endTime")Date endTime);

    Integer selectCount(@Param("param") CheckSearchParam param);

    List<CheckDetailDTO> selectCheckDetailDTOList(@Param("param") CheckSearchParam param);

    int deleteBatch(@Param("idList")List<Integer> idList);
}
